// HDU2196 Computer
// 陈锋
#include <bits/stdc++.h>
using namespace std;
const int NN = 10000 + 8;
struct Edge {
  int v, w;
};
vector<Edge> G[NN];
int N, F[NN], SF[NN], FV[NN], H[NN];
/*
F(u)：Tree(u)中距离u的最长距离，H(u)：树中除了子树u外的点到u的最大距离。
F(u)一次DFS即可:  F(u)=max{w(u→v) + F(v)}
如何计算H? 假设u有k个子: v1,v2…,vk:
v不是F(u)经过的点，H(v) = w(v,u)+max(F(u), H(u))
反之，不能选择F(u), 要选择Tree(u)第二大距离SF(U)，H(v)=w(v,u) + max(SF(u),H(u))
 所求结果就是max{F(u), H(u)}
*/
int dfsF(int u) {
  int &f = F[u], &sf = SF[u];
  f = 0, sf = 0;
  for (size_t ei = 0; ei < G[u].size(); ei++) {
    const Edge& e = G[u][ei];
    int nf = dfsF(e.v) + e.w;
    if (nf >= f) {
      sf = f;
      f = nf, FV[u] = e.v;
    } else if (nf > sf)
      sf = nf;
  }
  return f;
}

void dfsH(int u) {  // H[u]: 所求解
  for (size_t ei = 0; ei < G[u].size(); ei++) {
    const Edge& e = G[u][ei];
    H[e.v] = max(H[u], FV[u] == e.v ? SF[u] : F[u]) + e.w;
    dfsH(e.v);
  }
}

int main() {
  ios::sync_with_stdio(false), cin.tie(0);
  while (cin >> N && N) {
    for (int i = 1; i <= N; ++i) G[i].clear();
    for (int u = 2, v, w; u <= N; ++u)
      cin >> v >> w, G[v].push_back((Edge){u, w});
    dfsF(1);
    H[1] = 0;
    dfsH(1);
    for (int i = 1; i <= N; ++i) cout << max(F[i], H[i]) << endl;
  }

  return 0;
}
// Accepted 62ms 2048kB 1011 G++2020-12-08 20:50:00 34803065